# 这块代码了解即可，为了防止使用KMeans出现内存泄露OOM（out of memory）
import os
os.environ['OMP_NUM_THREADS'] = '4'

from sklearn.datasets import make_blobs                 # 随机参数样本数据
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans                      # KMeans聚类算法
from sklearn.metrics import calinski_harabasz_score     # 轮廓系数

if __name__ == '__main__':
    # 1- 准备数据
    """
        n_samples：样本数据条数
        n_features：特征个数     作为横纵坐标
        centers：质心的坐标位置
        cluster_std：样本数据的标准差，值越大那么数据越分散
    """
    x,y = make_blobs(
        n_samples=1000,
        n_features=4,
        centers=[[-1,-1], [0,0], [1,1], [2,2]],
        cluster_std=[0.4, 0.2, 0.2, 0.2],
        random_state=729
    )
    # print(x)
    # print(y)

    # 绘制样本数据的散点图
    plt.scatter(x[:, 0], x[:, 1], c=y)
    plt.title("make_blobs")
    plt.show()


    # 2- 机器学习和样本数据聚类
    model = KMeans(n_clusters=4)
    y_pred = model.fit_predict(x)

    # 3- 聚类效果评估
    # 3.1- 绘制预测数据的散点图
    plt.scatter(x[:, 0], x[:, 1], c=y_pred)
    plt.title("KMeans")
    plt.show()

    # 3.2- 评估
    # 轮廓系数越大越好
    print("原始样本_轮廓系数：",calinski_harabasz_score(x,y))
    print("聚类预测_轮廓系数：",calinski_harabasz_score(x,y_pred))